<?php

if (!defined('IS_INITPHP')) {
    exit('Access Denied!');
}

use xmpush\Builder;
use xmpush\IOSBuilder;
use xmpush\HttpBase;
use xmpush\Sender;
use xmpush\Constants;
use xmpush\Stats;
use xmpush\Tracer;
use xmpush\Feedback;
use xmpush\DevTools;
use xmpush\Subscription;
use xmpush\TargetedMessage;

include_once INITPHP_PATH . '/library/xmpush/autoload.php';

class xmpushInit {

    public static $Model = array();

    /**
     * 设置APP的包名和秘钥（在发送消息前必须设置）
     * @param string $package
     * @param string $secret
     * @return void
     */
    public function setAppConfig($package, $secret, $is_test = false) {
        Constants::setPackage($package);
        Constants::setSecret($secret);
        if ($is_test == true) {
            Constants::useSandbox();
        } else {
            Constants::useOfficial();
        }
    }

    /**
     * 获取实例化的通知栏消息对象（ios）
     * @param string $desc 
     * @param array $extra
     * @return object $message
     */
    public function setMessage_ios($title, $desc, $payload = '', $extra = array()) {
        $message = new IOSBuilder(); //建立IOSBuilder对象，用来构造消息。APNs消息体为256个字符。
        $message->description(urldecode($desc));
        $message->soundUrl('default');
        $message->badge('1'); //可选项，自定义通知数字角标。
        // $message->category("action");  // 可选项，iOS8推送消息快速回复类别。
        if (is_array($payload)) {
            $payload = json_encode(self::urlDecodeOnMap($payload));
        }
        $message->extra('payload', $payload);
        foreach ($extra as $key => $val) {
            $message->extra($key, $val);
        }
        $message->build();
        return $message;
    }

    /**
     * 获取实例化的通知栏消息对象（android）
     * @param string $title 
     * @param string $desc 
     * @param string $payload  
     * @param array $extra
     * @param string notifyid  
     * @return object $message
     */
    public function setNoticeMessage_android($title, $desc, $payload = '', $extra = array(), $notifyid = 0) {
        $message = new Builder();
        $message->title(urldecode($title));  // 通知栏的title
        $message->description(urldecode($desc)); // 通知栏的descption
        $message->passThrough(0);  // 这是一条通知栏消息，如果需要透传，把这个参数设置成1,同时去掉title和descption两个参数
        if (is_array($payload)) {
            $payload = json_encode(self::urlDecodeOnMap($payload));
        }
        $message->payload($payload); // 携带的数据，点击后将会通过客户端的receiver中的onReceiveMessage方法传入。
        $message->extra(Builder::notifyForeground, 1); //可选项，开启/关闭app在前台时的通知弹出。 1开启0关闭  
        $message->notifyId($notifyid); // 通知类型。最多支持0-4 5个取值范围，同样的类型的通知会互相覆盖，不同类型可以在通知栏并存
        foreach ($extra as $key => $val) {
            $message->extra($key, $val);
        }
        $message->build();
        return $message;
    }

    /**
     * 获取实例化的透传消息对象（android）
     * @param string $payload  
     * @param array $extra
     * @return object $message
     */
    public function setPassMessage_android($title, $desc, $payload = '', $extra = array()) {
        $message = new Builder();
        $message->passThrough(1);  // 这是一条通知栏消息，如果需要透传，把这个参数设置成1,同时去掉title和descption两个参数
        if (is_array($payload)) {
            $payload = json_encode(self::urlDecodeOnMap($payload));
        }
        $message->payload($payload); // 携带的数据，点击后将会通过客户端的receiver中的onReceiveMessage方法传入。
        foreach ($extra as $key => $val) {
            $message->extra($key, $val);
        }
        $message->build();
        return $message;
    }

    /**
     * 根据指定别名单发
     * @param object $message
     * @param string $alias
     * @return object
     */
    public function sendToAlias($message, $alias) {
        return self::getInstance('Sender')->sendToAlias($message, $alias)->getRaw();
    }

    /**
     * 根据指定别名列表群发(一次最多1000个)
     * @param object $message
     * @param array $aliasList
     * @return object
     */
    public function sendToAliases($message, $alias_list) {
        return self::getInstance('Sender')->sendToAliases($message, $alias_list)->getRaw();
    }

    /**
     * 向所有设备发送消息
     * @param object $message
     * @return object
     */
    public function broadcastAll($message) {
        return self::getInstance('Sender')->broadcastAll($message)->getRaw();
    }

    /**
     * 追踪消息状态
     * @param string $messsageId 发送消息后返回的消息ID
     */
    public function tracer($messageId) {
        return self::getInstance('Tracer')->getMessageStatusById($messageId)->getRaw();
    }

    /**
     * 获取失效的regId列表，每次请求最多返回1000个regId。每次请求之后，成功返回的失效的regId将会从MiPush数据库删除。
     * @return 
     */
    public function getInvalidRegIds() {
        return self::getInstance('Feedback')->getInvalidRegIds()->getRaw();
    }

    /**
     * 保存对象
     * @return object
     */
    protected static function getInstance($className) {
        if (!isset(self::$Model[$className])) {
            $newClass = '\\xmpush\\' . $className;
            self::$Model[$className] = new $newClass();
        }
        return self::$Model[$className];
    }

    /**
     * 数组循环urldecode
     */
    protected static function urlDecodeOnMap($data) {
        return is_array($data) ? array_map(array('xmpushInit', 'urlDecodeOnMap'), $data) : (is_numeric($data) ? $data : urldecode($data) );
    }

}

?>
